﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "CollaborationCacheInterface.h"

namespace gcmp
{
    class IDocument;

    /// \brief Element编辑权限工具类
    class COLLABORATION_CACHE_INTERFACE_EXPORT ElementEditPrivilegeUtils final
    {
    public:
        /// \brief 判断该构件是否可编辑
        ///
        /// 在缓存中找不到的构件，认为是没有编辑权限的 
        ///
        /// \param pDocment 文档指针
        /// \param elementId 需要判断编辑权限的ElementId
        /// \return bool true：有编辑权限；false：没有编辑权限
        static bool CanEdit(const IDocument* pDocment, const ElementId& elementId);

        /// \brief 批量判断构件是否可编辑
        ///
        /// 在缓存中找不到的构件，认为是没有编辑权限的。
        /// 文档中无权限管理器时，认为不在构件协同环境下，返回true。
        ///
        /// \param pDocment 文档指针
        /// \param elementIds[in] 需要判断编辑权限的ElementIds
        /// \param elementsEditPrivilege[out] 批量获取的构件权限
        /// \return bool 输入为空，或者全部获取成功为true；有任意的Element获取失败，返回false
        static bool CanEdit(const IDocument* pDocment, const std::vector<ElementId>& elementIds, std::unordered_map<ElementId, bool, ElementIdHash>& elementsEditPrivilege);

        /// \brief 将构建的编辑权限设置到缓存中
        ///
        /// 不存在添加，存在用新值覆盖
        ///
        /// \param pDocment 文档指针
        /// \param elementId 需要设置编辑权限的ElementId
        /// \param canEdit 编辑权限；true：有编辑权限；false：没有编辑权限
        /// \return void
        static void SetElementEditPrivilege(IDocument* pDocment, const ElementId& elementId, bool canEdit);

        /// \brief 批量设置构建的编辑权限到缓存中
        ///
        /// 不存在添加，存在用新值覆盖
        ///
        /// \param pDocment 文档指针
        /// \param elementsEditPrivilege 需要设置编辑权限的ElementIds及对应权限
        /// \return void
        static void SetElementsEditPrivilege(IDocument* pDocment, const std::unordered_map<ElementId, bool, ElementIdHash>& elementsEditPrivilege);

        /// \brief 从缓存中删除构件的编辑权限
        ///
        /// \param pDocment 文档指针
        /// \param elementId 需要删除编辑权限的ElementId
        /// \return void
        static void DeleteElementEditPrivilege(IDocument* pDocment, const ElementId& elementId);

        /// \brief 从缓存中批量删除构件的编辑权限
        ///
        /// \param pDocment 文档指针
        /// \param elementId 需要删除编辑权限的批量ElementId
        /// \return void
        static void DeleteElementsEditPrivilege(IDocument* pDocment, const std::vector<ElementId>& elementIds);

        /// \brief 将构件锁id及同批加锁的构件ids设置到缓存中
        ///
        /// 没有则添加，有则覆盖
        ///
        /// \param pDocment 文档指针
        /// \param elementsLockId 锁id
        /// \param elementIds 同批加锁的构件ids
        /// \return void
        static void SetElementsLock(IDocument* pDocment,const std::wstring& elementsLockId, const std::vector<ElementId>& elementIds);

        /// \brief 根据锁id拿到同批加锁的构件ids
        ///
        /// \param pDocment 文档指针
        /// \param elementsLockId[in] 锁id
        /// \param elementIds[out] 同批加锁的构件ids
        /// \return void
        static void GetElementIdsByLockId(const IDocument* pDocment,const std::wstring& elementsLockId, std::vector<ElementId>& elementIds);

        /// \brief 拿到所有的锁id及对应的同批加锁的构件ids
        ///
        /// \param pDocment 文档指针
        /// \return std::unordered_map<std::wstring, std::vector<ElementId>> 所有的锁id及对应的同批加锁的构件ids
        static const std::unordered_map<std::wstring, std::vector<ElementId>>* GetAllElementsLock(const IDocument* pDocment);

        /// \brief 根据锁id删除同批加锁的构件ids
        ///
        /// \param pDocment 文档指针
        /// \param elementsLockId 锁id
        /// \return void
        static void DeleteElementsLock(IDocument* pDocment,const std::wstring& elementsLockId);

        /// \brief 删除所有的锁id及对应的同批加锁的构件ids
        ///
        /// \param pDocment 文档指针
        /// \return void
        static void DeleteAllElementsLock(IDocument* pDocment);
    };
}


